#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int MAXN=210;
int n,m,man[MAXN][2],house[MAXN][2],cnt1,cnt2,cost[MAXN][MAXN],vol[MAXN][MAXN],f[MAXN*2],t,last[MAXN*2],ans;
bool vis[MAXN*2];
void SPFA()
{
	queue<int>q;
	while(!q.empty())q.pop();
	memset(f,0x3f3f3f3f,sizeof(f));
	memset(last,-1,sizeof(last));
	memset(vis,0,sizeof(vis));
	q.push(0);
	vis[0]=true;
	f[0]=0;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=false;
		for(int v=0;v<=t;++v)
		{
			if(vol[u][v]&&f[u]+cost[u][v]<f[v])
			{
				f[v]=f[u]+cost[u][v];
				last[v]=u;
				if(!vis[v])
				{
					q.push(v);
					vis[v]=true;
				}
			}
		}
	}
	return;
}
int main()
{
	while(true)
	{
		scanf("%d%d",&n,&m);
		if(!n)break;
		ans=cnt1=cnt2=0;
		memset(cost,0,sizeof(cost));
		memset(vol,0,sizeof(vol));
		for(int i=1;i<=n;++i)
		{
			char temp[110];
			scanf("%s",temp+1);
			for(int j=1;j<=m;++j)
			{
				if(temp[j]=='m')
				{
					man[++cnt1][1]=i;
					man[cnt1][2]=j;
				}
				else if(temp[j]=='H')
				{
					house[++cnt2][1]=i;
					house[cnt2][2]=j;
				}
			}
		}
		t=cnt1+cnt2+1;
		for(int i=1;i<=cnt1;++i)
		{
			for(int j=1;j<=cnt2;++j)
			{
				cost[i][j+cnt1]=abs(man[i][1]-house[j][1])+abs(man[i][2]-house[j][2]);
				cost[j+cnt1][i]=-cost[i][j+cnt1];
				vol[i][j+cnt1]=1;
			}
		}
		for(int i=1;i<=cnt1;++i)vol[0][i]=1;
		for(int i=cnt1+1;i<=t-1;++i)vol[i][t]=1;
		while(true)
		{
			SPFA();
			if(last[t]==-1)break;
			int x=t;
			while(~last[x])
			{
				--vol[last[x]][x];
				++vol[x][last[x]];
				x=last[x];
			}
			ans+=f[t];
		}
		printf("%d\n",ans);
	}
	return 0;
}
